from openpyxl import load_workbook, Workbook
from common.log import logger
import json
import jsonpath
import replace


class execl:
    def add_excel(self, file_path, *args):
        '''创建一个工作簿'''
        try:
            open(file_path)
            a = '路径文件已存在'
        except FileNotFoundError:
            a = '路径文件不存在,可以直接新建文件'
        w = Workbook()
        if a=='路径文件已存在':
            iup=input('是否要覆盖之前的文件？y覆盖，n取消创建\n')
            if iup=='y':
                w.save(file_path)
                return '文件创建成功'
            if iup=='n':
                return '取消创建文件'
        if a=='路径文件不存在,可以直接新建文件':
            # 获取当前工作sheet
            # w_s = w.active
            # '''默认的第一个shell表单的名字,不写有默认值Shell'''
            # w_s.title = "she"
            # 创建一个工作表，index指定创建的工作表的位置(索引值)，默认在最后面,index=0就是最前面，title指定工作表的名称
            # w_s = w.create_sheet(index=args[0], title="Shell2")
            # 保存文件
            w.save(file_path)
            return '文件创建成功'

    def read_excel(self, file_path, sheet_name, row=1, column=1, format='List'):
        '''
        :param file_path: 已经存在文件路径
        :param sheet_name: 表单名字
        :param row: 从第几行开始读
        :param column: 从第几列开始读
        :param format: List是列表包含一行数据,不是的话就是元组
        :return: 返回读取的数据以列表包含列表或者包含元组的格式
        '''
        try:
            '''只能打开存在的文件read_only=True 设置只读'''
            wb = load_workbook(filename=file_path, read_only=True)
            '''打开一张表'''
            sheet = wb[sheet_name]
            rows = sheet.max_row
            columns = sheet.max_column
            list_row = []
            for i in range(row, rows + 1):
                list_column = []
                for j in range(column, columns + 1):
                    a = sheet.cell(row=i, column=j).value
                    list_column.append(a)
                if format == 'List':
                    b = list_column
                    list_row.append(b)
                else:
                    b = list_column
                    b = tuple(b)
                    list_row.append(b)
            return list_row
        except Exception as e:
            return '读取错误,异常信息为--{}'.format(e)
    def read_for_row(self,file_path,sheet_name,row=2,column=1):
        '''
        读一行
        :param file_path:
        :param sheet_name:
        :param row:
        :param column:
        :return:
        '''
        wb = load_workbook(filename=file_path, read_only=True)
        '''打开一张表'''
        sheet = wb[sheet_name]
        rows = sheet.max_row
        columns = sheet.max_column
        for j in range(row, rows + 1):
            list_column = []
            for i in range(column, columns + 1):
                a = sheet.cell(row=j, column=i).value
                list_column.append(a)
            return list_column
    def read_column(self,file_path,sheet_name,column=1,row=100):
        wb = load_workbook(filename=file_path, read_only=True)
        '''打开一张表'''
        sheet = wb[sheet_name]
        list_column = []
        rows = sheet.max_row #超过几百就很慢，基本用不了
        for i in range(1, row+1):
            a = sheet.cell(row=i, column=column).value
            list_column.append(a)
        # print(list_column)
        return list_column


    def write_execl(self, file_path, sheet_name, data):
        '''
        :param data:列表元组互相嵌套,可以长短不一 [[]] or (())
        :return: 写入结果
        '''
        try:
            wb = load_workbook(filename=file_path, read_only=False)
            sheet = wb[sheet_name]
            logger.info('开始写入')
            for i in range(1, len(data) + 1):
                '''每一行的长度不一样,用索引去找每一行的长度'''
                for j in range(1, len(data[i - 1]) + 1):
                    '''
                    [i-1]索引0第一行,根据j循环写入[j-1]的值,
                    把第一个被包含的列表的值写完后跳出循环,写第二行(第二个被包含列表)
                    '''
                    sheet.cell(row=i, column=j, value=data[i - 1][j - 1])
                    '''注意要保存，不然就是白加'''
            '''注意等循环写完再保存'''
            wb.save(file_path)
            wb.close()
            logger.info('写入成功')
        except Exception as e:
            return '写入失败，异常信息为--{}'.format(e)


if __name__ == '__main__':
    data = [['标题', '参数', 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 3, 2]]
    execls = execl()
    # print(execl.add_excel('E:\ctms_api\data\he1.xlsx'))
    # print(execl.write_execl('E:\ctms_api\data\he1.xlsx','Sheet',data))
    # print(execl.read_excel('E:\ctms_api\data\he1.xlsx','Sheet'))
    dataS=execls.read_excel('E:\ctms_api\data\he1.xlsx','Sheet',2,1)
    print(dataS)
